还有设计模式这种东西嘛。。。
设计模式自学指南,几分钟掌握学习重点
大家好,我是鱼皮,前段时间我在 B 站发布了一个【设计模式】的导学视频。不出所料,无论我怎么改标题,这个视频的播放量都无比惨淡,侧面反映了设计模式没有那么大众化吧。。。
我感觉还是挺遗憾的,明明是一个软件开发人员必备的重点知识技能,但是却没有像算法、计网之类的那么流行。而且看了评论区后,我发现别说很多同学没有系统学习过它,甚至都不知道有设计模式这么个东西!
所以这篇文章是希望给大家强调一下设计模式的重要性,并且分享一下我自学设计模式的经验。
主要是以下几个问题:
设计模式是什么?有什么用?为什么要学它? 什么时候学? 要学什么知识?哪些是重点? 怎么学?有哪些方法和资源? 以及面试的时候可能会考什么?
花几分钟了解这几个问题后,再去学设计模式,相信能帮助大家抓住重点,节省时间、更高效地自学。
什么是设计模式?
设计模式是我们开发软件时针对常见问题的 通用 解决方案,也是前辈们在写代码时不断摸索总结出来的好方法。
可以理解为打游戏的攻略,就是我们遇到同一类的对手时,怎么走位、怎么放技能之类的。
设计模式有什么用?
设计模式最直接的作用就是 减少烂代码、让项目代码更好维护 。
举个栗子,如果没学过设计模式,可能随着产品不断加需求、改需求,你的代码会充满大量的 if else,新同事来了呢,也不敢动前人代码,只能再去补充 if else,于是屎山越堆越高。
而使用设计模式后,你可以把每段逻辑单独封装和维护,大家协作开发也会更高效。
为什么要学设计模式?
学好设计模式,不仅能让我们写出更好维护、性能更高的代码,还能开拓我们的思维,在遇到问题时能想到更多的解决方案。
因此设计模式也是软件开发岗面试的重点,想进大厂的同学一定要学习它。
此外,很多知名项目都用到了大量的设计模式,比如 Spring、MyBatis 等。如果不学习它,可能你天天写代码都是 CRUD、读别人的源码会非常吃力。
所以建议开发岗的朋友们都要认真学习设计模式。
什么时候学?
我建议大家在学过一门编程语言、并且能够使用开发框架去完成项目之后,再去学设计模式。如果你写代码的熟练度还不够的话,直接去学设计模式会比较吃力,可能也无法理解用设计模式的好处。
那如果你学前端的话,我建议你先把界面开发、JS 语法、组件库和 Vue / React 之类的框架运用熟练,有空了再把设计模式作为进阶知识来学习就好。
要学什么?
设计模式的学习主要分为两部分:
1. 软件开发原则
所有的设计模式基本都是建立以下几个软件开发原则的基础上。
比如开闭原则,就是建议我们把模块设计的好扩展一些,每次新增功能只需要加代码、而不用改老代码。
2. 学习主流设计模式
主流的设计模式共有以下 23 种:
注意,不是说设计模式只有 23 种!
其中单例、工厂方法、建造者、适配器、装饰器、代理、策略、责任链、观察者、迭代器模式是重点,我自己工作中经常用到这些、也总能在框架源码中见到它们。这些设计模式的特色也比较鲜明、相对比较好理解。
尤其是单例模式,是重点中的重点!它有很多种不同的实现方式,都要了解。我用的最多的应该是饿汉式还有双检锁模式。
设计模式学习路线
建议大家按照以下 3 个阶段来学习:
一、基础学习
目标:从上面提到的重点开始依次了解每一种设计模式的概念、作用、应用场景、特点、类和对象的关系,能够对设计模式有个基础的印象。
学习方式有很多种:
喜欢看视频的同学挑个高播放量的、讲师口音能接受的教程看就好了; 喜欢读书的同学可以看《图解设计模式》、《大话设计模式》,个人感觉这两本书都还不错,我自己是看前者入门的。 想快速上手的同学可以直接看菜鸟教程的文档,每个设计模式都有讲解和代码示例,还是比较推荐的。像我有的时候忘了某个冷门的设计模式,也是靠这个文档快速补回来。
这里建议大家在学设计模式的时候多和实际生活结合,会更好理解一些。
比如适配器模式可以理解为用一个转接头连接两根线;代理模式理解为你找了个代购帮你去买东西;责任链模式理解为公司出了问题,员工依次甩锅。
二、编码实现
这个阶段的目标是:用你熟悉的编程语言来写代码实现每个设计模式,要能够独立(不借助任何资料)从 0 写出完整代码,这样才算是学会了。
如果刚开始大家不知道设计模式怎么应用的话,我建议去看一些示例代码。
可以直接在 GitHub 搜索关键词 Design Pattern
或 设计模式
,就能搜出来一大堆不同语言的代码了。
那我建议大家把自己写过的代码保存好,可以打造一个自己的设计模式代码库,写在简历上也是能加分的。
三、项目实战
本阶段的目标:能够根据某个场景主动选出合适的设计模式来优化代码,而不是说别人告诉你这里能用设计模式,你才想起来去用。这就是架构师和拧螺丝的区别。
这里给大家两个学习方法吧:
1. 搜索式
花时间到网上搜设计模式在知名框架中的应用,比如 Spring:
网上的文章很多,我就不一一列举了。比较建议大家在面试前这么干,可以快速积累。
2. 探索式
就是在你写代码的过程中,一旦遇到重复代码,就问一下自己:我能不能用上某个设计模式呢?合适的话就使用设计模式。次数多了,你就有经验了。
此外,我自己在写代码时,特别喜欢点进源码看一看,一般是能够通过文件命名来快速判断出它是否使用了设计模式的,然后你就可以进一步读源码来学习,帮助我积累了很多知识。
但我们也要注意,设计模式虽然好用,但它不是银弹,不要为了用而用。
比如非要把一句简单的 if else 搞成策略模式,过分使用设计模式只会徒增系统的复杂度。
面试考点
面试时对设计模式的考察可能比较多元,主要有理论、实践、源码等考法:
理论就是问你不同设计模式的概念、优缺点、应用场景,设计模式之间的区别等等。
实践就是让你手写某个设计模式。最常考的就是单例模式,我就被考过,当时还让我写出几种不同的单例模式实现。
源码就是说问你某个框架用了哪些设计模式,或者某个设计模式在哪些框架中应用过。如果我是面试官,大概率会这么考,因为能看出候选人的知识储备。
所以要想在设计模式这块不吃瘪,除了背八股文外,还是要保证能手写出常考的设计模式,并且多去了解一下它在知名项目中的应用。
以上就是本期分享。最后,欢迎加入 鱼皮的编程知识星球,抱团交流学习编程,随时向鱼皮 1 对 1 提问、帮你制定学习和求职计划不迷茫、跟着鱼皮直播做项目(往期项目可无限回看)、领取鱼皮原创编程学习 / 求职资料等。
扫码体验:
往期推荐